/*
******************************************************************************************************* 
**  Copyright (C) 2019, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:       	bar_scan.h
**  Description:	
**  Author:        	 
**  Version				v0.1
**  Date:           	2019-05-24
**	Function List： 
**  History:         
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                              	防止重复包含
*********************************************************************************************************
*/

#ifndef  _FOREACH_PLUNGER_H_
#define  _FOREACH_PLUNGER_H_
/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/



/*
*********************************************************************************************************
*                                              	头文件
*********************************************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "uart.h"
#include "stm32h7xx_hal.h"
#include "bsp_conf.h"
#include "log_console.h"
/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/

//#define QSTATUS_BUSY 0b01000000
#define QSTATUS_IDLE 0x60 //(00100000)
#define QSTATUS_ERR	 0x1F //(00011111)

#define FOREACH_POLL_INTERVAL  30

/*
*********************************************************************************************************
*                                              枚举和结构体类型定义
*********************************************************************************************************
*/
typedef enum{
	CMD_STRING = 's',	/*存储字符串命令*/
	CMD_RESOLUTION = 'N',	/*分辨率0是0.319ul/step 1是0.0199ul/step */
	CMD_INIT = 'Z',	/*初始化 复位*/
	CMD_POS = 'A',	/*绝对位置 N0模式下为0-3143 N1为0-50288 N2为0-1002617*/
	CMD_IN = 'P',	/*当前位置相对吸取*/
	CMD_OUT = 'D',	/*当前位置相对吐液*/
	CMD_VSTATRT = 'v',	/*启动速度*/
	CMD_VSTOP = 'c',	/*停止速度*/
	CMD_VMAX = 'V',	/*最大速度*/
	CMD_ACC = 'L',	/*设置加速度和减速度*/
	CMD_SPEED_LEVEL = 'S',	/*预定速度等级*/
	CMD_BACKLASH = 'K',	/*默认32*/
	CMD_IHOLD = 'h',	/*保持电流 单位0x01A 最大200*/
	CMD_IRUN = 'm',	/*最大电流 同上*/
	CMD_EXCUTE = 'R',	/*执行*/
	CMD_REEXCUTE = 'X',	/*重复执行一次上个字符串*/
	CMD_LOOP_START = 'g',	/*记录循环起点*/
	CMD_LOOP = 'G',	/*记录循环终点*/
	CMD_DELAY = 'M',	/*延时*/
	CMD_HOLD = 'H',	/*暂停执行*/
	CMD_SETIO = 'J',	/*设置端口*/
	CMD_TERMINATE = 'T',	/*终止执行*/
	CMD_CLEAR = 'C',	/*清除所有命令*/
	CMD_REMOVE_TIP = 'E',	/*弹出tip头 并回到原点*/
	CMD_PLLD = 't',	/*压力式液面探测*/
	CMD_CLLD = '^',	/*电容式液面探测 0-130*/
	CMD_HLLD = 'B',	/*混合液面探测*/
	CMD_DATAP = 'f',	/*开启压力数据输出*/
	CMD_DATAP_C = '+',	/**/
	CMD_GAIN_LLP = 'p',	/**/
	CMD_RESET_LLP = 'r',	/**/
	CMD_QURY_BUFF = 'Q',	/*查询buff状态*/
	CMD_FIRMWARE = '&',	/**/
	CMD_READ_STATUS = '?',	/*询问各种参数*/
	CMD_PARA_SET = '?',	/*设置各种参数*/
	/*!0 复位 !22参数重置*/
}fp_key_t;
/*'?'命令的询问地址 列举用到的 具体看datasheet的P58*/
typedef enum{
	POS_MM = 2,
	POS_NL = 3,
	PUMP_STATUS = 29,/*equal to Q cmd*/
	TIP_STATUS = 31,
	PRESSURE_WIN = 38,
	CURRENT_TEMP = 53,
	CAPACITANCE = 68,
	GENERNAL_SET = 76,
	PUMP_SET = 77,
}read_addr_t;

//#pragma pack(1)
//typedef struct{
//	uint8_t head; /*首字节'/'*/
//	uint8_t address; /*拨码地址起始0x30*/
//}fp_cmd_head_t;
//#pragma pack()

typedef enum{
	PSTATUS_IDLE,
	PSTATUS_MOVING,
	PSTATUS_HOMING,
	PSTATUS_ERR,
}plunger_status_t;

typedef struct PLUNGER_DEVICE{
//	bsp_uart_t * p_uart;
	uint8_t address;
	uint8_t qstatus;
	
	uint8_t tipstatus;
	uint16_t capacitance;
	uint16_t capacity_threshold;
	plunger_status_t p_status;
	struct PLUNGER_DEVICE* next;
//	void	(*pfn_recv_cb)(struct PLUNGER_DEVICE*,uint8_t * buff,uint16_t size);
}plunger_t;
typedef enum{
	PLUNGER_ERR_NONE,
	PLUNGER_MOVE_CPLT,
	PLUNGER_CAPACITY_EXCEED,
	PLUNGER_TIP_DROP,
	PLUNGER_CATCH_ERR,
}plunger_event_t;
typedef struct{
	uint8_t wait_ack;
	uint8_t last_address;
	uint8_t last_cmd;
	uint8_t last_qury_address;
	uint8_t bus_interval;/*总线等待轮询等待间隔*/
}bus_t;/*485总线相关参数*/

typedef void (*pfn_plunger_status_callback)(plunger_t*,plunger_event_t);
//typedef void	(*cr100_scan_rlt_callback)(struct PLUNGER_DEVICE*,uint8_t * buff,uint16_t size);
/*
*********************************************************************************************************
*                                              	全局变量声明
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                              	函数声明
*********************************************************************************************************
*/

uint8_t bsp_plunger_init(pfn_plunger_status_callback);
plunger_t* plunger_init(uint8_t ascii_address);
uint8_t plunger_pos(plunger_t* p_device,int32_t pos);
uint8_t plungnger_qury_status(plunger_t* p_device);
uint8_t plungnger_qury_capacity(plunger_t* p_device);
uint8_t plungnger_home(plunger_t* p_device);
plunger_status_t plunger_get_status(plunger_t* p_device);
uint8_t plunger_poll(int64_t tick);/*轮询函数 注意485轮询间隔*/
uint8_t plunger_capacity(plunger_t* p_device,uint32_t capacity);
uint8_t plunger_bus_enable(void);
//uint8_t is_capacity_exceed(plunger_t* p_device);
#endif
